iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

用LeetCode來訓練大腦的邏輯思維系列 第 4

LeetCode 13. Roman to Integer

  • 分享至 

  • xImage
  •  

題目

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

題意

將整數轉羅馬數字,此題目與第12題相反。

若遇到49這兩種數字,表示法會不一樣。
4不會是IIII,而是IV,相當於5-1的意思,9不會是VIIII,而是IX,相當於10-1的意思,
以此類推,40 >> XL90 >> XC

輸入的範圍介於1 to 3999

Example 1:

Input: III
Output: 3

Example 2:

Input: IV
Output: 4

Example 3:

Input: IX
Output: 9

Example 4:

Input: LVIII
Output: 58

解題步驟

這題相對於12題,算是簡單版的,
整體來說,只要將羅馬數字中相對應的數值加總,就可以得到答案,
有個例外,就是遇到49的處理,譬如:IV,就不是相加了,而是5-1

該如何處理這塊?

首先要找出,羅馬數字排列的規律
我們可以發現它由左至右是從大到小排列的,也就是說左邊的羅馬數字通常會大於右邊的羅馬數字,除非遇到像是49這種的,那就必須相減(-)了。

先宣告陣列:

let romanNum = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000
}

處理相加(+)或相減(-)的情況:
若左邊大於等於(>=)右邊,就相加(+),若左邊小於(<)右邊,就相減(-)

將參數轉陣列,宣告加總變數:

let strAry = s.split('');
let sum = 0;

若左邊小於(<)右邊,就相減(-),不然就相加(+):

for (let i = 0; i < strAry.length; i++) {
    if (romanNum[strAry[i]] < romanNum[strAry[i + 1]]) {
        sum -= Number(romanNum[strAry[i]]);
    } else {
        sum += Number(romanNum[strAry[i]]);
    }
}

Solution

let romanNum = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000
}

function romanToInt(s) {
    let strAry = s.split('');
    let sum = 0;
    for (let i = 0; i < strAry.length; i++) {
        if (romanNum[strAry[i]] < romanNum[strAry[i + 1]]) {
            sum -= Number(romanNum[strAry[i]]);
        } else {
            sum += Number(romanNum[strAry[i]]);
        }
    }
    return sum;
}

上一篇
LeetCode 7. Reverse Integer
下一篇
LeetCode 14. Longest Common Prefix
系列文
用LeetCode來訓練大腦的邏輯思維30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言